from playwright.sync_api import sync_playwright, Browser, PlaywrightContextManager

class BrowserUtil:

    """
    初始化类的实例，设置playwright和browser属性为初始值None。

    Parameters:
        self: 当前实例的引用。

    Returns:
        None
    """
    def __init__(self):
        self.playwright: PlaywrightContextManager = None
        self.browser: Browser = None

    """打开浏览器

    Args:
        browser_type (str, optional): 浏览器类型，默认为"chromium"。支持的类型包括"chromium", "firefox", "webkit"。
        **kwargs: 传递给浏览器启动方法的附加参数，例如headless、slow_mo等。

    Returns:
        None
    """
    def open_browser(self, browser_type: str = "chromium", **kwargs) -> None:

        # 启动Playwright并初始化相关资源
        self.playwright = sync_playwright().start()

        # 根据指定的浏览器类型启动浏览器实例
        self.browser = self.playwright[browser_type].launch(**kwargs)

    """打开指定 URL 的页面。

    Args:
        url (str): 需要打开的目标页面 URL 地址

    Returns:
        Page: 新创建并加载完成目标 URL 的页面对象

    Raises:
        RuntimeError: 当浏览器未启动时抛出（需先调用 open_browser() 方法）

    """
    def open_page(self, url: str) -> "Page":

        # 检查浏览器是否已成功启动
        if not self.browser:
            raise RuntimeError("浏览器未启动，请先调用 open_browser() 方法")
        page = self.browser.new_page()
        page.goto(url)
        return page

    """关闭浏览器并释放资源。

    参数:
    无

    返回值:
    None
    """
    def close_browser(self) -> None:

        # 关闭浏览器实例（如果存在）
        if self.browser:
            self.browser.close()

        # 停止Playwright服务（如果已启动）
        if self.playwright:
            self.playwright.stop()